package com.shujia

import scala.io.Source

object Code33JoinComputer {
  def main(args: Array[String]): Unit = {

    val stuInfoList: List[(String, String, Int, String, String)] = Source
      .fromFile("scala_code/data/students.txt")
      .getLines()
      // 将读取到的每一行数据转换成List中的元素
      .toList
      .map(
        (line: String) => {
          val colum: Array[String] = line.split(",")
          // (id,name,age,gender,clazz)
          //  Tuple相比较Array 其元素的数据类型可以多样
          (colum(0), colum(1), colum(2).toInt, colum(3), colum(4))
        }
      )


    val oneIDAllScore: Map[String, List[(String, String, String)]] = Source
      .fromFile("scala_code/data/score.txt")
      .getLines()
      // 将读取到的每一行数据转换成List中的元素
      .toList
      .map(
        line => {
          val column: Array[String] = line.split(",")
          // (id,(科目ID,成绩))
          (column(0), column(1), column(2))
        }
      )
      // 如果以(id,(科目ID,成绩))形式转成Map 那么根据Map的特性，科目成绩只保存了一个
      // 所以需要将相同ID的所有数据集合形成一个容器
      //  .toMap
      .groupBy(
        oneScore => oneScore._1
      )


    stuInfoList
//      .map( // 将 map 替换成flatMap
      .flatMap(
        oneStuInfo => {
          val stuID: String = oneStuInfo._1
          // 通过get函数获取数据得到Option，如果有数据那么是Some 没有则为None
          //          val maybeTuples: Option[List[(String, String, String)]] = oneIDAllScore.get(stuID)

          // 由于已经判断是否包含
          if (oneIDAllScore.contains(stuID)) {
            // 使用Map(key)方式很安全
            val allScore: List[(String, String, String)] = oneIDAllScore(stuID)

            val oneStuJoinRes: List[(String, String, Int, String, String, String, String)] = allScore.map(
              oneScore => (oneStuInfo._1, oneStuInfo._2, oneStuInfo._3, oneStuInfo._4, oneStuInfo._5, oneScore._2, oneScore._3)
            )
            // 返回结果
            oneStuJoinRes
          } else {
            // 如果ID没有关联上，那么对于Score数据使用None进行替代
            List((oneStuInfo._1, oneStuInfo._2, oneStuInfo._3, oneStuInfo._4, oneStuInfo._5, None, None))
          }
        }
      ).foreach(println)
//      .flatMap(
//        // 将每个List进行返回
////        list => list
//        _
//      )


    //    map.foreach(println)

    // 作业： 完成Join 和 全关联 逻辑

  }
}
